﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class PolizaSeguro : IPolizaSeguro
    {
        #region Miembros de IPolizaSeguro

        public IList<PolizaSeguroInfo> Listar(PolizaSeguroInfo oPolizaSeguro)
        {
            var sqlParm = new SqlParameter[7];
            var oListaPoliza = new List<PolizaSeguroInfo>();

            sqlParm[0] = new SqlParameter("@Nro_Poliza", SqlDbType.VarChar);
            if (oPolizaSeguro.NroPoliza != null)
                sqlParm[0].Value = oPolizaSeguro.NroPoliza;
            else
                sqlParm[0].Value = DBNull.Value;


            sqlParm[1] = new SqlParameter("@Id_Tipo_Seguro", SqlDbType.VarChar);
            if (oPolizaSeguro.IdTipoSeguro != null)
                sqlParm[1].Value = oPolizaSeguro.IdTipoSeguro;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
            if (oPolizaSeguro.RucProveedor != null)
                sqlParm[2].Value = oPolizaSeguro.RucProveedor;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Inicio_Vigencia_Desde", SqlDbType.DateTime);
            if (oPolizaSeguro.InicioVigenciaDesde.HasValue)
                sqlParm[3].Value = oPolizaSeguro.InicioVigenciaDesde;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Inicio_Vigencia_Hasta", SqlDbType.DateTime);
            if (oPolizaSeguro.InicioVigenciaHasta.HasValue)
                sqlParm[4].Value = oPolizaSeguro.InicioVigenciaHasta;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Fin_Vigencia_Desde", SqlDbType.DateTime);
            if (oPolizaSeguro.FinVigenciaDesde.HasValue)
                sqlParm[5].Value = oPolizaSeguro.FinVigenciaDesde;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Fin_Vigencia_Hasta", SqlDbType.DateTime);
            if (oPolizaSeguro.InicioVigenciaHasta.HasValue)
                sqlParm[6].Value = oPolizaSeguro.InicioVigenciaHasta;
            else
                sqlParm[6].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_POLIZA_SEGURO", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaPoliza.Add(new PolizaSeguroInfo(drd.GetString(0).Trim(), 
                                drd.GetString(1).Trim(), new TipoSeguroInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim()),
                                drd.GetString(3).Trim(), new ProveedorInfo(drd.GetString(3).Trim(), drd.GetString(4).Trim()), 
                                drd.GetString(5).Trim(), drd.GetString(6), drd.GetDateTime(7), drd.GetDateTime(8), drd.GetString(9).Trim(), 
                                drd.GetString(10).Trim(), Double.Parse(drd.GetValue(11).ToString()), drd.GetString(12).Trim(), null));
                        }
                    }
                }
            }
            return oListaPoliza;
        }

        public PolizaSeguroInfo Consultar(PolizaSeguroInfo oPolizaSeguro)
        {
            var sqlParm = new SqlParameter[7];
            var oEntPoliza = new PolizaSeguroInfo();

            sqlParm[0] = new SqlParameter("@Nro_Poliza", SqlDbType.VarChar);
            if (oPolizaSeguro.NroPoliza != null)
                sqlParm[0].Value = oPolizaSeguro.NroPoliza;
            else
                sqlParm[0].Value = DBNull.Value;


            sqlParm[1] = new SqlParameter("@Id_Tipo_Seguro", SqlDbType.VarChar);
            if (oPolizaSeguro.IdTipoSeguro != null)
                sqlParm[1].Value = oPolizaSeguro.IdTipoSeguro;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
            if (oPolizaSeguro.RucProveedor != null)
                sqlParm[2].Value = oPolizaSeguro.RucProveedor;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Inicio_Vigencia_Desde", SqlDbType.DateTime);
            if (oPolizaSeguro.InicioVigenciaDesde.HasValue)
                sqlParm[3].Value = oPolizaSeguro.InicioVigenciaDesde;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Inicio_Vigencia_Hasta", SqlDbType.DateTime);
            if (oPolizaSeguro.InicioVigenciaHasta.HasValue)
                sqlParm[4].Value = oPolizaSeguro.InicioVigenciaHasta;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Fin_Vigencia_Desde", SqlDbType.DateTime);
            if (oPolizaSeguro.FinVigenciaDesde.HasValue)
                sqlParm[5].Value = oPolizaSeguro.FinVigenciaDesde;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Fin_Vigencia_Hasta", SqlDbType.DateTime);
            if (oPolizaSeguro.InicioVigenciaHasta.HasValue)
                sqlParm[6].Value = oPolizaSeguro.InicioVigenciaHasta;
            else
                sqlParm[6].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_POLIZA_SEGURO", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oEntPoliza = new PolizaSeguroInfo(drd.GetString(0).Trim(),
                                drd.GetString(1).Trim(), new TipoSeguroInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim()),
                                drd.GetString(3).Trim(), new ProveedorInfo(drd.GetString(3).Trim(), drd.GetString(4).Trim()),
                                drd.GetString(5).Trim(), drd.GetString(6), drd.GetDateTime(7), drd.GetDateTime(8), drd.GetString(9).Trim(),
                                drd.GetString(10).Trim(), Double.Parse(drd.GetValue(11).ToString()), drd.GetString(12).Trim(), null);
                        }
                    }
                }
            }
            return oEntPoliza;
        }

        public bool Registrar(PolizaSeguroInfo oPolizaSeguro)
        {
            var bExito = false;
            var sqlParm = new SqlParameter[11];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Nro_Poliza", SqlDbType.VarChar);
                    if (oPolizaSeguro.NroPoliza != null)
                        sqlParm[0].Value = oPolizaSeguro.NroPoliza;
                    else
                        sqlParm[0].Value = DBNull.Value;


                    sqlParm[1] = new SqlParameter("@Id_Tipo_Seguro", SqlDbType.VarChar);
                    if (oPolizaSeguro.IdTipoSeguro != null)
                        sqlParm[1].Value = oPolizaSeguro.IdTipoSeguro;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
                    if (oPolizaSeguro.RucProveedor != null)
                        sqlParm[2].Value = oPolizaSeguro.RucProveedor;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Asegurado", SqlDbType.VarChar);
                    if (oPolizaSeguro.Asegurado != null)
                        sqlParm[3].Value = oPolizaSeguro.Asegurado;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Descripcion", SqlDbType.VarChar);
                    if (oPolizaSeguro.Descripcion != null)
                        sqlParm[4].Value = oPolizaSeguro.Descripcion;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Fecha_Inicio_Vigencia", SqlDbType.DateTime);
                    if (oPolizaSeguro.FechaInicioVigencia.HasValue)
                        sqlParm[5].Value = oPolizaSeguro.FechaInicioVigencia;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Fecha_Fin_Vigencia", SqlDbType.DateTime);
                    if (oPolizaSeguro.FechaFinVigencia.HasValue)
                        sqlParm[6].Value = oPolizaSeguro.FechaFinVigencia;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Cobertura", SqlDbType.VarChar);
                    if (oPolizaSeguro.Cobertura != null)
                        sqlParm[7].Value = oPolizaSeguro.Cobertura;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Id_Moneda", SqlDbType.VarChar);
                    if (oPolizaSeguro.IdMoneda != null)
                        sqlParm[8].Value = oPolizaSeguro.IdMoneda;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Suma_Asegurada", SqlDbType.Decimal);
                    if (oPolizaSeguro.SumaAsegurada.HasValue)
                        sqlParm[9].Value = oPolizaSeguro.SumaAsegurada;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oPolizaSeguro.IdUsuarioSistema != null)
                        sqlParm[10].Value = oPolizaSeguro.IdUsuarioSistema;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_POLIZA_SEGURO", sqlParm);
                    var oDetalle = new PolizaSeguroDetalle();
                    foreach (var oEntDetalle in oPolizaSeguro.Detalle)
                    {
                        oEntDetalle.IdUsuarioSistema = oPolizaSeguro.IdUsuarioSistema;
                        if (!oDetalle.Registrar(oEntDetalle, trx))
                        {
                            break;
                        }
                        else
                        {
                            bExito = true;
                        }
                    }

                    if (bExito)
                        trx.Commit();
                    else
                        trx.Rollback();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
                return bExito;
            }
        }

        public bool Actualizar(PolizaSeguroInfo oPolizaSeguro)
        {
            var bExito = false;
            var sqlParm = new SqlParameter[11];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Nro_Poliza", SqlDbType.VarChar);
                    if (oPolizaSeguro.NroPoliza != null)
                        sqlParm[0].Value = oPolizaSeguro.NroPoliza;
                    else
                        sqlParm[0].Value = DBNull.Value;


                    sqlParm[1] = new SqlParameter("@Id_Tipo_Seguro", SqlDbType.VarChar);
                    if (oPolizaSeguro.IdTipoSeguro != null)
                        sqlParm[1].Value = oPolizaSeguro.IdTipoSeguro;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
                    if (oPolizaSeguro.RucProveedor != null)
                        sqlParm[2].Value = oPolizaSeguro.RucProveedor;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Asegurado", SqlDbType.VarChar);
                    if (oPolizaSeguro.Asegurado != null)
                        sqlParm[3].Value = oPolizaSeguro.Asegurado;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Descripcion", SqlDbType.VarChar);
                    if (oPolizaSeguro.Descripcion != null)
                        sqlParm[4].Value = oPolizaSeguro.Descripcion;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Fecha_Inicio_Vigencia", SqlDbType.DateTime);
                    if (oPolizaSeguro.FechaInicioVigencia.HasValue)
                        sqlParm[5].Value = oPolizaSeguro.FechaInicioVigencia;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Fecha_Fin_Vigencia", SqlDbType.DateTime);
                    if (oPolizaSeguro.FechaFinVigencia.HasValue)
                        sqlParm[6].Value = oPolizaSeguro.FechaFinVigencia;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Cobertura", SqlDbType.VarChar);
                    if (oPolizaSeguro.Cobertura != null)
                        sqlParm[7].Value = oPolizaSeguro.Cobertura;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Id_Moneda", SqlDbType.VarChar);
                    if (oPolizaSeguro.IdMoneda != null)
                        sqlParm[8].Value = oPolizaSeguro.IdMoneda;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Suma_Asegurada", SqlDbType.Decimal);
                    if (oPolizaSeguro.SumaAsegurada.HasValue)
                        sqlParm[9].Value = oPolizaSeguro.SumaAsegurada;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oPolizaSeguro.IdUsuarioSistema != null)
                        sqlParm[10].Value = oPolizaSeguro.IdUsuarioSistema;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_POLIZA_SEGURO", sqlParm);
                    var oDetalle = new PolizaSeguroDetalle();
                    foreach (var oEntDetalle in oPolizaSeguro.Detalle)
                    {
                        if (!oDetalle.Registrar(oEntDetalle, trx))
                        {
                            break;
                        }
                        else
                        {
                            bExito = true;
                        }
                    }

                    if (bExito)
                        trx.Commit();
                    else
                        trx.Rollback();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
                return bExito;
            }
        }

        #endregion
    }
}
